package negocio;


import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.hibernate.criterion.Order;

import basicas.Artista;
import basicas.Evento;
import basicas.Ingresso;
import basicas.Local;
import basicas.Produtora;
import basicas.SetorLocal;
import basicas.organizacionais.Funcao;
import basicas.organizacionais.Funcionario;
import basicas.organizacionais.Setor;
import dados.geral.ArtistaDAO;
import dados.geral.CaracteristicaSetorDAO;
import dados.geral.DAOFactory;
import dados.geral.EventoDAO;
import dados.geral.FuncaoDAO;
import dados.geral.FuncionarioDAO;
import dados.geral.IngressosDAO;
import dados.geral.LocalDAO;
import dados.geral.ProdutoraDAO;
import dados.geral.SetorDAO;
import dados.geral.SetorLocalDAO;


public class Controlador {

	private FuncaoDAO daoFuncao;	
	private SetorDAO daoSetor;	
	private FuncionarioDAO daoFuncionario;	
	private LocalDAO daoLocal;	
	private SetorLocalDAO daoSetorLocal;	
	private CaracteristicaSetorDAO daoCaracteristicaSetor;    
	private ArtistaDAO daoArtista;   
    private ProdutoraDAO daoProdutora;
    private EventoDAO daoEvento;
    private IngressosDAO daoIngressos;
    	
	
	public Controlador() {
		daoFuncao = DAOFactory.getFuncaoDAO();
		
		daoSetor = DAOFactory.getSetorDao();
		
		daoFuncionario = DAOFactory.getFuncionarioDao();
		
		daoLocal = DAOFactory.getLocalDao();
		
		daoSetorLocal = DAOFactory.getSetorLocalDao();
		
		daoCaracteristicaSetor = DAOFactory.getCaracteristicaSetorDao();
       
		daoArtista = DAOFactory.getArtistaDAO();
		
		daoProdutora = DAOFactory.getpProdutoraDAO();
		
		daoIngressos = DAOFactory.getIngressosDAO();
		 

	}

//INICIO FUNCIONARIO
	public void inserirFuncionario(Funcionario objeto) {
		daoFuncionario.inserir(objeto);
	}

	public final void alterarFuncionario(Funcionario objeto) {
		daoFuncionario.alterar(objeto);
	}

	public final void removerFuncionario(Funcionario objeto) {
		daoFuncionario.remover(objeto);
	}

	public final List<Funcionario> pesquisarFuncionario(Funcionario objeto) {
		return daoFuncionario.pesquisar(objeto);
	}
        
        public final Funcionario getFuncionarioByCodigo(int codigo){
                return daoFuncionario.buscarPorChave(codigo);
        }

	public List<Funcionario> listarFuncionarios() {
		return daoFuncionario.listarTodos();
	}
//FIM FUNCIONARIO
//////////////////////////////////////////////////////////////////////////////
	
	
	public Local alterar(Local objeto) {
		return daoLocal.alterar(objeto);
	}

	public List<SetorLocal> listarTodosSetoresLocal() {
		return daoSetorLocal.listarTodos();
	}

	public void inserir(Local objeto) {
		daoLocal.inserir(objeto);
	}

	public final void removerLocal(Local objeto) {
		daoLocal.remover(objeto);
	}

	public final List<Local> pesquisarLocal(Local objeto) {
		return daoLocal.pesquisar(objeto);
	}

	public List<Local> listarTodosLocal(Integer indiceInicial, Integer quantidade,
			Order... ordenacoes) {
		return daoLocal.listarTodos(indiceInicial, quantidade, ordenacoes);
	}
	
	
	
	
	

	public final Local buscarLocalPorChave(Serializable chave) {
		return daoLocal.buscarPorChave(chave);
	}

	public List<Local> listarTodosLocais() {
		return daoLocal.listarTodos();
	}

	public List<SetorLocal> listarTodos(Integer indiceInicial,
			Integer quantidade, Order... ordenacoes) {
		return daoSetorLocal.listarTodos(indiceInicial, quantidade, ordenacoes);
	}

	public SetorLocal alterar(SetorLocal objeto) {
		return daoSetorLocal.alterar(objeto);
	}

	
	

	

	public void inserir(SetorLocal objeto) {
		daoSetorLocal.inserir(objeto);
	}

	public final void remover(SetorLocal objeto) {
		daoSetorLocal.remover(objeto);
	}

	

	public List<SetorLocal> listarTodosSetorLocal(Integer indiceInicial,
			Integer quantidade) {
		return daoSetorLocal.listarTodos(indiceInicial, quantidade);
	}

	
	
//INICIO ARTISTA
        
        public void inserirArtista(Artista objeto){
                daoArtista.inserir(objeto);
        }
        
        public final void alterarArtista(Artista objeto) {
		daoArtista.alterar(objeto);
	}

	public final void removerArtista(Artista objeto) {
		daoArtista.remover(objeto);
	}

	public final List<Artista> pesquisarArtista(Artista objeto) {
		return daoArtista.pesquisar(objeto);
	}
        
        public final Artista getArtistaByCodigo(int codigo){
                return daoArtista.buscarPorChave(codigo);
        }
        
        
        public List<Artista> listarArtistas(){
            return daoArtista.listarTodos();
        }
        
//FIM ARTISTA        
//////////////////////////////////////////////////////////////////////////////        
//INICIO SETOR
        
        public void inserirSetor(Setor objeto) {
            daoSetor.inserir(objeto);
	}
        
        public final void alterarSetor(Setor objeto) {
		daoSetor.alterar(objeto);
	}

	public final void removerSetor(Setor objeto) {
		daoSetor.remover(objeto);
	}

	public final List<Setor> pesquisarSetor(Setor objeto) {
		return daoSetor.pesquisar(objeto);
	}
        
        public final Setor getSetorByCodigo(int codigo){
                return daoSetor.buscarPorChave(codigo);
        }
        
        public List<Setor> listarSetores(){
            return daoSetor.listarTodos();
        }
//FIM SETOR
//////////////////////////////////////////////////////////////////////////////                      
//INICIO FUNCAO        
        public Funcao alterarFuncao(Funcao objeto) {
		return daoFuncao.alterar(objeto);
	}

	public void inserirFuncao(Funcao objeto) {
		daoFuncao.inserir(objeto);
	}
	
	public final void inserirColecaoFuncoes(Collection<Funcao> colecao) {
		daoFuncao.inserirColecao(colecao);
	}

	public final void removerFuncao(Funcao objeto) {
		daoFuncao.remover(objeto);
	}

	public final Funcao getFuncaoByCodigo(int codigo){
                return daoFuncao.buscarPorChave(codigo);
        }
        
	public List<Funcao> listarFuncoes(){
		return daoFuncao.listarTodos();
	}

//FIM FUNCAO
//////////////////////////////////////////////////////////////////////////////        

	public void inserirProdutora(Produtora objeto) {
		daoProdutora.inserir(objeto);
	}
	
	
	
	public final void remover(Produtora objeto) {
		daoProdutora.remover(objeto);
	}
	
	
	public List<Produtora> listarTodos() {
		
		return daoProdutora.listarTodos();
		
		}
	
	// ********************* EVENTO ************************** //
	
	public Evento alterarEvento(Evento objeto) {
		return daoEvento.alterar(objeto);
	}

	public void inserirEvento(Evento objeto) {
		daoEvento.inserir(objeto);
	}

	public final void inserirColecaoEvento(Collection<Evento> colecao) {
		daoEvento.inserirColecao(colecao);
	}

	public final void removerEvento(Evento objeto) {
		daoEvento.remover(objeto);
	}

	public final Evento buscarEventoPorChave(Serializable chave) {
		return daoEvento.buscarPorChave(chave);
	}
	
	
	public List<Evento> listarTodosEvento(){
		return daoEvento.listarTodos();
	}	
	
	// ********************* FIM EVENTO ************************** //
	
	public List<Ingresso> listarIngressos(){
		return daoIngressos.listarTodos();
	}
	
	public void gerarIngressos(Ingresso objeto){
				
	 try {
		 List<SetorLocal> listaSetores = objeto.getEvento().getLocal().getSetorLocal();
			
			
			for (Iterator iterator = listaSetores.iterator(); iterator.hasNext();) {
				SetorLocal setorLocal = (SetorLocal) iterator.next();
				for (int i = 1; i <= setorLocal.getQtdMaxPessoas(); i++) {
					Ingresso ingresso = new Ingresso();
					ingresso.setCodigo(i);
					ingresso.setEvento(objeto.getEvento());
					ingresso.setSetorLocal(setorLocal);
					ingresso.setVendido(0);
					daoIngressos.inserir(ingresso);
			
				}
			}
		
	} catch (Exception e) {
		// TODO: handle exception
	}	
		
		
		
		
			
		
	}

	
	
	

}
